#include <iostream>

// TIP 要<b>Run</b>代码，请按 <shortcut actionId="Run"/> 或点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
#include <iostream>
#include <sstream>
#include <unordered_map>
#include <vector>
using namespace std;

int func1() {
    string line, legalChars;
    getline(cin, line);  // 输入 keywords
    getline(cin, legalChars);  // 输入 legalChars

    // 统计合法字符集出现次数
    unordered_map<char, int> legalCount;
    for (char c : legalChars) {
        legalCount[c]++;
    }

    stringstream ss(line);
    string word;
    int total = 0;

    // 遍历每个关键词
    while (ss >> word) {
        unordered_map<char, int> wordCount;
        bool valid = true;
        for (char c : word) {
            wordCount[c]++;
            if (wordCount[c] > legalCount[c]) {  // 超过合法字符数
                valid = false;
                break;
            }
        }
        if (valid) total += word.size();
    }

    cout << total << endl;
    return 0;
}

int func2() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string s;          // 第一行：笔记内容 note
    if (!getline(cin, s)) return 0;

    // 若输入里包含包裹的引号（示例里显示 "abcd"），去掉外层引号
    if (!s.empty() && s.front() == '"' && s.back() == '"' && s.size() >= 2) {
        s = s.substr(1, s.size() - 2);
    }

    int k;             // 第二行：数字 k
    if (!(cin >> k)) return 0;

    vector<pair<char,int>> st; // 栈：{字符, 当前连续计数}
    st.reserve(s.size());

    for (char c : s) {
        if (!st.empty() && st.back().first == c) {
            st.back().second++;
        } else {
            st.push_back({c, 1});
        }
        if (st.back().second == k) st.pop_back(); // 达到 k 个相邻相同 → 删除
    }

    // 还原结果
    string ans;
    for (auto &p : st) ans.append(p.second, p.first);

    cout << '"' << ans << '"' << '\n';  // 若评测不要求引号，可去掉两侧引号
    return 0;
}


int func3() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string line;
    if (!getline(cin, line)) { cout << 0 << '\n'; return 0; }

    // 解析第一行：空格分隔的整数
    stringstream ss(line);
    vector<int> nums;
    for (long long x; ss >> x; ) nums.push_back((int)x);

    int n = (int)nums.size();
    if (n <= 1) { cout << n << '\n'; return 0; }

    // dp[i]: 公差 -> 以 i 结尾的最长长度
    vector<unordered_map<int,int>> dp(n);
    int ans = 2; // 至少两项构成等差子序列

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            long long diffLL = (long long)nums[i] - (long long)nums[j];
            int d = (int)diffLL; // 题目数据范围安全
            int prev = dp[j].count(d) ? dp[j][d] : 1; // 1 表示只包含 nums[j]
            dp[i][d] = max(dp[i][d], prev + 1);
            ans = max(ans, dp[i][d]);
        }
    }

    cout << ans << '\n';
    return 0;
}